home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / palette tools / colorsaver / src / main.c < prev    next >
C/C++ Source or Header  |  1996-04-07  |  32KB  |  1,053 lines

  1. /****************************************************************************
  2.  *    ColorSaver --- A popup color palette commodity
  3.  *
  4.  *    05 January 1993
  5.  *    Compiled with DICE
  6.  *
  7.  *    Copyright © 1993, 1994 By Dan Fish
  8.  *    All rights reserved.
  9.  *
  10.  *    Permission is granted to freely redistribute this program provided 
  11.  *    the source code and documentation are included in the distribution,
  12.  *    changes are clearly documented, and this copyright notice remains
  13.  *      unchanged.
  14.  *
  15.  ****************************************************************************/
  16.  
  17.  
  18. #include <exec/memory.h>                        /*N*/
  19. #include <clib/macros.h>                        /*N*/
  20. #include <libraries/commodities.h>
  21. #include <intuition/intuition.h>
  22. #include <intuition/intuitionbase.h>
  23. #include <workbench/startup.h>
  24.  
  25. #include <stdlib.h>                             /*N*/
  26. #include <string.h>                             /*N*/
  27. #include <stdarg.h>                             /*N*/
  28. #include <stdio.h>
  29.  
  30. #include <clib/exec_protos.h>                   /*N*/
  31. #include <clib/commodities_protos.h>            /*N*/
  32. #include <clib/utility_protos.h>                /*N*/
  33. #include <clib/intuition_protos.h>              /*N*/
  34. #include <clib/alib_protos.h>                   /*N*/
  35. #include <clib/gadtools_protos.h>               /*N*/
  36. #include <clib/graphics_protos.h>               /*N*/
  37.  
  38. /*#include <exec/types.h>*/
  39. /*#include <exec/errors.h>*/
  40. /*#include <dos/dos.h>*/
  41. /*#include <libraries/gadtools.h>*/
  42. /*#include <libraries/asl.h>*/
  43. /*#include <intuition/classes.h>*/
  44. /*#include <intuition/gadgetclass.h>*/
  45. /*#include <devices/printer.h>*/
  46. /*#include <workbench/icon.h>*/
  47. /*#include <workbench/workbench.h>*/
  48. /*#include <clib/alib_protos.h>*/
  49. /*#include <clib/dos_protos.h>*/
  50. /*#include <clib/asl_protos.h>*/
  51. /*#include <clib/wb_protos.h>*/
  52.  
  53. #include "gadgets.h"               /* GadToolsBox file     */
  54. #include "protos.h"            /* Routine prototypes    */
  55. #include "simplerexx.h"            /* ARexx stuff        */
  56. #include "defs.h"
  57.  
  58. /*-------------------------------------------------------------------------
  59.  * The following strings represent the
  60.  * possible tooltypes of the ColorSaver icon.
  61.  *-------------------------------------------------------------------------*/
  62.  
  63. UBYTE   *CX_PRIORITY        =       "CX_PRIORITY";
  64. UBYTE   *CX_POPUP           =       "CX_POPUP";
  65. UBYTE   *CX_POPKEY          =       "CX_POPKEY";
  66. UBYTE   *CX_QUIT            =       "CX_QUIT";
  67. UBYTE   *CX_HSV         =       "HSV";
  68. UBYTE   *CX_SEL         =       "SELECT";
  69. UBYTE   *CX_PATH            =       "PATH";
  70. UBYTE   *CX_POP_X           =       "POP_X";
  71. UBYTE   *CX_POP_Y           =       "POP_Y";
  72.  
  73. /*-------------------------------------------------------------------------
  74.  * Following are the default ColorSaver
  75.  * settings which can be changed with
  76.  * the command line or the icon tooltypes.
  77.  *-------------------------------------------------------------------------*/
  78.  
  79. #define  CX_DEFPRI           0
  80. #define  CX_DEFSEL           0
  81. #define  CX_DEFPOP_X       175
  82. #define  CX_DEFPOP_Y        50
  83. UBYTE   *CX_DEFPOPKEY       =       "lalt ralt c";
  84. UBYTE   *CX_DEFPOPUP        =       "YES";
  85. UBYTE   *CX_DEFMODE         =       "RGB";
  86. UBYTE   *CX_DEFQUIT         =       "lalt ralt q";
  87. UBYTE   *CX_DEFPATH         =       "SYS:Prefs/Presets";
  88.  
  89. /*-------------------------------------------------------------------------
  90.  * Some Commodity definitions
  91.  *-------------------------------------------------------------------------*/
  92.  
  93. #define  CX_SHOW            1L                      /* show window */
  94. #define  CX_SHUTUP          2L                      /* quit ColorSaver */
  95. #define  CxOn( b )          ActivateCxObj( b, TRUE )
  96. #define  CxOff( b )         ActivateCxObj( b, FALSE );
  97.  
  98. /*-------------------------------------------------------------------------
  99.  * I used this stuff for debugging
  100.  *-------------------------------------------------------------------------*/
  101. #ifdef CS_DEBUG
  102. UBYTE *conwinname   = "CON:10/10/620/180/CS_Debug";
  103. FILE *conwin = NULL;
  104. #endif
  105.  
  106. /*-------------------------------------------------------------------------
  107.  * Miscellaneous program information.
  108.  *-------------------------------------------------------------------------*/
  109.  
  110. #define  CSVersion          "v1.18"
  111. #define  CSName             "ColorSaver"
  112. #define  CSDescr            "Color Palette Tool"
  113. #define  CSCopy             "© 1994, Dan Fish"
  114. #define  CSDate             __DATE__
  115. #define  CSTitle            CSName " " CSVersion ", " CSCopy
  116.  
  117. /*-------------------------------------------------------------------------
  118.  * Shell version string.
  119.  *-------------------------------------------------------------------------*/
  120. #define  CSVerString        "$VER: " CSName " " CSVersion ", " CSDate ", "CSCopy
  121. static UBYTE CsVer[]        = {  CSVerString  };
  122.  
  123. /*-------------------------------------------------------------------------
  124.  * The NewBroker structure defining
  125.  * some important information for
  126.  * the commodities.library and Exchange.
  127.  *-------------------------------------------------------------------------*/
  128.  
  129. struct NewBroker             CSNBrok  = {
  130.     NB_VERSION, CSName, CSTitle, CSDescr,
  131.     NBU_NOTIFY | NBU_UNIQUE, COF_SHOW_HIDE, NULL, 0
  132. };
  133.  
  134. /*-------------------------------------------------------------------------
  135.  * DCBack required data. DCBack is a tiny link library
  136.  * written by Jan van den Baard to make it possible to write
  137.  * auto-detachable programs with DICE. DCBack also parses the
  138.  * argument line for you using ReadArgs().
  139.  *-------------------------------------------------------------------------*/
  140.  
  141. UBYTE                       *_procname      = CSName "_" CSVersion;
  142. UBYTE                       *_template      = "PRIORITY/K/N,POPUP/K,POPKEY/K,QUIT/K,POP_X/K/N,POP_Y/K/N,PATH/K,SELECT/K/N,HSV/S";
  143. UBYTE                       *_exthelp       = NULL;
  144. LONG                         _stack         = 4096L;
  145. LONG                         _priority      = NULL;
  146. LONG                         _BackGroundIO  = NULL;
  147.  
  148. /*-------------------------------------------------------------------------
  149.  * ARexx declarations
  150.  *-------------------------------------------------------------------------*/
  151.  
  152. AREXXCONTEXT    RexxStuff;
  153. UBYTE RexxName[64];
  154.  
  155. /*-------------------------------------------------------------------------
  156.  * Required libraries that are not in DICE's
  157.  * auto-init library.
  158.  *-------------------------------------------------------------------------*/
  159.  
  160. struct Library              *CxBase        = NULL;
  161. struct Library              *IconBase      = NULL;
  162. struct Library              *WorkbenchBase = NULL;
  163.  
  164. /*-------------------------------------------------------------------------
  165.  * The following libraries are all auto-init.
  166.  *-------------------------------------------------------------------------*/
  167.  
  168. extern struct IntuitionBase        *IntuitionBase;
  169. extern struct UtilityBase          *UtilityBase;
  170. extern struct GadToolsBase         *GadToolsBase;
  171.  
  172. /*-------------------------------------------------------------------------
  173.  * Some other useful global variables
  174.  *-------------------------------------------------------------------------*/
  175.  
  176. struct MsgPort          *CSComPort  = NULL;    /* commodity port    */
  177. struct MsgPort          *CSIdPort   = NULL;     /* IDCMP port        */
  178. CxObj                   *CSBroker   = NULL;    /* the broker        */
  179. ULONG                    CSMask     = NULL;    /* the port bit-mask     */
  180. ULONG                    CSIdMask   = NULL;     /* IDCMP port bit-mask    */
  181. ULONG                    RexxMask   = NULL;     /* ARexx port bit-mask    */
  182. UBYTE                   *CSTTypes   = NULL;    /* the tooltype array    */
  183. ULONG                   *CSArgs;        /* shell args array    */
  184. struct Screen         *Scr        = NULL;    /* screen we open up on    */
  185. struct WBStartup        *WbMsg      = NULL;     /* workbench message    */
  186. UBYTE                   *CSPopkey;              /* popkey string ptr    */
  187. UBYTE                   *Palette_Dir;           /* default palette path */
  188. UBYTE                    CSIsOpen   = FALSE;    /* window open?     */
  189. UBYTE                    CSPop      = TRUE;     /* open on startup?    */
  190. UBYTE                    CSWTitle[80];          /* window title     */
  191. UWORD                    ColorSaverLeft;    /* left edge of window  */
  192. UWORD                    ColorSaverTop;        /* top edge of window   */
  193. UWORD              RedVal;        /* RGB red value    */
  194. UWORD              GreenVal;        /* RGB green value    */
  195. UWORD              BlueVal;        /* RGB blue value    */
  196. UWORD              HueLevel;        /* HSV hue         */
  197. UWORD              SatLevel;              /* HSV saturation    */
  198. UWORD              ValLevel;              /* HSV value         */
  199. ULONG             NumColors;        /* # of colors in palette   */
  200. SHORT             CurrentColor=0;    /* Currently selected color */
  201. USHORT                  *ResetPal = NULL;    /* Palette w/window first opens */
  202. USHORT                  *SavePal = NULL;           /* Snapshot of current palette*/
  203. UBYTE            ScanFileSpec[256];    /* filename for binary scan */
  204. UWORD                   CycleSelect = 0;    /* ordinal value of cycle gad */
  205. USHORT             ColorMode = RGB_COLORMODE;    /* Color selection mode        */
  206.  
  207. UBYTE   LoadFile[32];        
  208. UBYTE   LoadDir[224];        
  209. UBYTE   ScanFile[32];        
  210. UBYTE   ScanDir[224];        
  211. UBYTE   FileSpec[224];
  212.  
  213. /* =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  214.  *
  215.  *    E X E C U T A B L E      C O D E      B E G I N S    H E R E 
  216.  *
  217.  *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
  218.  
  219. /*=============================================================================
  220.  * Starting point if called from the Shell
  221.  *===========================================================================*/
  222.  
  223. void main( long argc, long *array )
  224. {
  225.     CSArgs = array;
  226.  
  227.     SetupCS();
  228.     EventHandler();
  229.     CloseDownCS( NULL );
  230. }
  231.  
  232. /*=============================================================================
  233.  * Starting point if called from the WorkBench
  234.  *===========================================================================*/
  235.  
  236. void wbmain( struct WBStartup *wbs )
  237. {
  238.     WbMsg = wbs;
  239.  
  240.     SetupCS();
  241.     EventHandler();
  242.     CloseDownCS( NULL );
  243. }
  244.  
  245. /*-------------------------------------------------------------------------
  246.  * Open up all required resources. Check the
  247.  * arguments passed to ColorSaver from the argument
  248.  * line if run from the shell or the tool types
  249.  * when run from the workbench.
  250.  *-------------------------------------------------------------------------*/
  251.  
  252. void SetupCS( void )
  253. {
  254.     CxObj           *tmp;
  255.     UBYTE           *quitkey, *popup;
  256.     WORD             priority;
  257.     LONG             error;
  258.     UBYTE         *str;
  259.  
  260.     /*  Initialize all the file names/paths    */
  261.  
  262.     LoadFile[0] = '\0';
  263.     ScanFile[0] = '\0';
  264.     ScanDir[0]  = '\0';
  265.  
  266.  
  267.     if ( ! ( CxBase = OpenLibrary( "commodities.library", 37L ))) {
  268.         error = 20L;
  269.         CloseDownCS( error );
  270.     }
  271.  
  272.    /*
  273.     * This one is required by the Argxxxx()
  274.     * routines from the amigas20.lib.
  275.     */
  276.  
  277.     if ( ! ( IconBase = OpenLibrary( "icon.library", 34L ))) {
  278.         error = 21L;
  279.         CloseDownCS( error );
  280.     }
  281.  
  282.     if ( ! ( WorkbenchBase = OpenLibrary( "workbench.library", 37L ))) {
  283.         error = 22L;
  284.         CloseDownCS( error );
  285.     }
  286.  
  287. #ifdef CS_DEBUG
  288.     if(!(conwin = fopen(conwinname,"r+"))){
  289.         error = 30;
  290.      CloseDownCS( error );
  291.       }
  292. #endif
  293.  
  294. /*-------------------------------------------------------------------------
  295.  * When WbMsg is non-null it means that  ColorSaver was started from the
  296.  * workbench, otherwise it was started from the shell.
  297.  *-----------------------------------------------------------------------*/
  298.  
  299.     if ( WbMsg ) {
  300.  
  301.        CSTTypes = ( UBYTE * )ArgArrayInit( NULL, ( UBYTE ** )WbMsg );
  302.  
  303.        priority = ArgInt(( char ** )CSTTypes, CX_PRIORITY, CX_DEFPRI );
  304.        popup    = ArgString(( char ** )CSTTypes, CX_POPUP,    CX_DEFPOPUP  );
  305.        CSPopkey = ArgString(( char ** )CSTTypes, CX_POPKEY,   CX_DEFPOPKEY );
  306.        quitkey  = ArgString(( char ** )CSTTypes, CX_QUIT,     CX_DEFQUIT   );
  307.        ColorSaverLeft = ArgInt(( char ** )CSTTypes, CX_POP_X,  CX_DEFPOP_X );
  308.        ColorSaverTop = ArgInt(( char ** )CSTTypes, CX_POP_Y,  CX_DEFPOP_Y  );
  309.        Palette_Dir = ArgString(( char ** )CSTTypes, CX_PATH,  CX_DEFPATH   );
  310.        CurrentColor  = ArgInt(( char ** )CSTTypes, CX_SEL,   CX_DEFSEL     );
  311.  
  312.        if( ArgString(( char ** )CSTTypes, CX_HSV,NULL))
  313.         ColorMode = HSV_COLORMODE;
  314.  
  315.     } else {   /* started from shell */
  316.  
  317.         if ( CSArgs[ 0 ] )  priority = ( WORD )*(( ULONG * )CSArgs[ 0 ] );
  318.         else                priority = CX_DEFPRI;
  319.         if ( CSArgs[ 1 ] )  popup    = ( UBYTE * )CSArgs[ 1 ];
  320.         else                popup    = CX_DEFPOPUP;
  321.         if ( CSArgs[ 2 ] )  CSPopkey = ( UBYTE * )CSArgs[ 2 ];
  322.         else                CSPopkey = CX_DEFPOPKEY;
  323.         if ( CSArgs[ 3 ] )  quitkey  = ( UBYTE * )CSArgs[ 3 ];
  324.         else                quitkey  = CX_DEFQUIT;
  325.         if ( CSArgs[ 4 ] )  ColorSaverLeft = ( UWORD )*((ULONG *)CSArgs[ 4 ]);
  326.         else                ColorSaverLeft = CX_DEFPOP_X;
  327.         if ( CSArgs[ 5 ] )  ColorSaverTop = ( UWORD )*((ULONG *)CSArgs[ 5 ]);
  328.         else                ColorSaverTop = CX_DEFPOP_Y;
  329.         if ( CSArgs[ 6 ] )  Palette_Dir = ( UBYTE * )CSArgs[ 6 ];
  330.         else                Palette_Dir  = CX_DEFPATH;
  331.         if ( CSArgs[ 7 ] )  CurrentColor = ( SHORT )*(( ULONG * )CSArgs[ 7 ] );
  332.         else                CurrentColor  = CX_DEFSEL;
  333.         if ( CSArgs[ 8 ] )  ColorMode  = HSV_COLORMODE;
  334.  
  335. #ifdef CS_DEBUG
  336.  
  337.     if(CSArgs[0])
  338.       fprintf(conwin,"CSArgs[0] = %x, %d\n",CSArgs[0], priority);
  339.     if(CSArgs[1])
  340.       fprintf(conwin,"CSArgs[1] = %s\n",CSArgs[1]);
  341.     if(CSArgs[2])
  342.       fprintf(conwin,"CSArgs[2] = %s\n",CSArgs[2]);
  343.     if(CSArgs[3])
  344.       fprintf(conwin,"CSArgs[3] = %s\n",CSArgs[3]);
  345.     if(CSArgs[4])
  346.       fprintf(conwin,"CSArgs[4] = %s\n",CSArgs[4]);
  347.     if(CSArgs[5])
  348.       fprintf(conwin,"CSArgs[5] = %x, %d\n",CSArgs[5], CurrentColor);
  349.     if(CSArgs[6])
  350.       fprintf(conwin,"CSArgs[6] = HSV\n");
  351.     fflush(conwin);
  352. #endif
  353.  
  354.     }
  355.  
  356. /*
  357.  * If a palette path tooltype was specified, use it...
  358.  * If a palette path tooltype was NOT specified (or the default was 
  359.  * specified), check for an environment variable.  If the environment 
  360.  * variable exists, use it... otherwise use the default path
  361.  */
  362.  
  363.     strcpy(LoadDir,CX_DEFPATH);
  364.     if((str = getenv("CS_PALETTES")) != NULL)
  365.        strcpy(LoadDir,str);
  366.  
  367.     if (stricmp(Palette_Dir, CX_DEFPATH) != 0)
  368.        strcpy(LoadDir,Palette_Dir);
  369.  
  370.     strcpy(RexxName,"ColorSaver.");
  371.     RexxStuff=InitARexx(RexxName,NULL);
  372.     RexxMask = ARexxSignal(RexxStuff);
  373.  
  374.     if(!(ResetPal = AllocMem(64L,MEMF_PUBLIC)))
  375.       CloseDownCS( 43L );
  376.  
  377.  
  378.     if(!(SavePal = AllocMem(64L,MEMF_PUBLIC)))
  379.       CloseDownCS( 44L );
  380.  
  381.     CSNBrok.nb_Pri = priority;
  382.  
  383.     if ( Stricmp( popup, CX_DEFPOPUP )) CSPop = FALSE;
  384.  
  385.     if ( CSComPort = CreateMsgPort()) {
  386.  
  387.         CSMask          = ( 1L << CSComPort->mp_SigBit );
  388.         CSNBrok.nb_Port = CSComPort;
  389.  
  390.         if ( CSBroker = CxBroker( &CSNBrok, NULL )) {
  391.             if ( tmp = HotKey( CSPopkey, CSComPort, CX_SHOW )) {
  392.  
  393.                 AttachCxObj( CSBroker, tmp );
  394.  
  395.                 if ( tmp = HotKey( quitkey, CSComPort, CX_SHUTUP )) {
  396.  
  397.                     AttachCxObj( CSBroker, tmp );
  398.  
  399.                     if ( ! CxObjError( CSBroker )) {
  400.                         CxOn( CSBroker );
  401.                         return;  
  402.                     } else
  403.                         error = 24L;
  404.                 } else
  405.                     error = 25L;
  406.             } else
  407.                 error = 26L;
  408.         } else
  409.             error = 27L;
  410.     } else
  411.         error = 28L;
  412.  
  413. CloseDownCS( error );
  414.  
  415. }
  416.  
  417. /*=============================================================================
  418.  * Here it is...
  419.  * The main program loop which wait for events from the different ports set
  420.  * up... Commodity, IDCMP, ARexx 
  421.  *===========================================================================*/
  422.  
  423. void EventHandler( void )
  424. {
  425.     ULONG      sig;
  426.     UBYTE      running = TRUE;
  427.  
  428.    /*
  429.     * Open ColorSaver window when
  430.     * CX_POPUP is YES.
  431.     */
  432.  
  433.     if ( CSPop ) OpenTheWindow();
  434.  
  435.     /*
  436.      * Wait for the commodity, ARexx, and (if open) the window ports.
  437.      */
  438.     do {
  439.         sig = Wait( CSMask | CSIdMask | RexxMask);
  440.  
  441.         if (( sig & CSMask ) == CSMask ) running = HandleCXEvent();
  442.         if (( sig & CSIdMask ) == CSIdMask )
  443.             if ( CSIsOpen ) running = HandleIDCMPEvent();
  444.         if (( sig & RexxMask ) == RexxMask ) running = HandleARexxEvent();
  445.        
  446.     } while ( running );
  447.  
  448.     CloseTheWindow();
  449.     CxOff( CSBroker );
  450. }
  451.  
  452. void GetScrInfo( void )
  453. {
  454.    Scr = IntuitionBase->FirstScreen;   
  455.    NumColors = (1L << Scr->BitMap.Depth);
  456.  
  457.  }
  458.  
  459. void ResetPalette( int mode )
  460. {
  461.   if(mode == RETRIEVE_IT)
  462.     {
  463.      LoadRGB4(&Scr->ViewPort,ResetPal,1L << Scr->BitMap.Depth);
  464.      SetProps(CurrentColor);
  465.    }
  466.   if(mode == STORE_IT)
  467.     CopyMem((void *)Scr->ViewPort.ColorMap->ColorTable,(void *)ResetPal,64L);
  468.  
  469.  }
  470.  
  471.  
  472. /*=============================================================================
  473.  * Open up the ColorSaver window and get
  474.  * the pointer to the userport and
  475.  * the port it's bit mask.
  476.  *===========================================================================*/
  477.  
  478. void OpenTheWindow()
  479. {
  480.  
  481.    if(!CSIsOpen )
  482.     {
  483.         GetScrInfo();             /* Get Screen pointer            */
  484.     ResetPalette(STORE_IT);   /* Store colors for "UNDO"       */
  485.  
  486.         CSIsOpen = TRUE;
  487.  
  488.         strcpy( CSWTitle, CSTitle);
  489.         ColorSaverWdt = &CSWTitle[0];
  490.  
  491.         if ( SetupScreen()) {
  492.             CloseTheWindow();
  493.             return;
  494.         }
  495.  
  496.         if ( OpenColorSaverWindow()) {
  497.             CloseTheWindow();
  498.             return;
  499.         }
  500.  
  501.     SetOurPointer(MAIN_POINTER, TRUE);
  502.  
  503.     SetColorMode(ColorMode);
  504.     SetPaletteColor(CurrentColor);
  505.     SetProps(CurrentColor);
  506.  
  507.         CSIdPort = ColorSaverWnd->UserPort;
  508.         CSIdMask = ( 1L << CSIdPort->mp_SigBit );
  509.  
  510.         return;
  511.     }
  512. }
  513.  
  514. /*=============================================================================
  515.  * Close the ColorSaver window, clear the userport and bit mask
  516.  *===========================================================================*/
  517.  
  518. void CloseTheWindow( void )
  519. {
  520.     if ( CSIsOpen ) {
  521.         ResetPointerColors();
  522.         CloseColorSaverWindow();
  523.         CloseDownScreen();
  524.         CSIdPort = NULL;
  525.         CSIdMask = NULL;
  526.         CSIsOpen = FALSE;
  527.     }
  528. }
  529.  
  530. /*=============================================================================
  531.  * Close down and "KILL" ColorSaver, deallocating system resources
  532.  *===========================================================================*/
  533.  
  534. void CloseDownCS( __D0 LONG code )
  535. {
  536.     struct Message      *tmp;
  537.  
  538.     if ( CSBroker      )    DeleteCxObjAll( CSBroker );
  539.     if ( CSComPort     ) {
  540.         while ( tmp = GetMsg( CSComPort )) ReplyMsg( tmp );
  541.         DeleteMsgPort( CSComPort );
  542.     }
  543.     if ( ResetPal      )    FreeMem(ResetPal,64L);
  544.     if ( SavePal       )    FreeMem(SavePal,64L);
  545.     if ( RexxStuff     )    FreeARexx(RexxStuff);
  546.     if ( CSTTypes      )    ArgArrayDone();
  547.     if ( WorkbenchBase )    CloseLibrary( WorkbenchBase );
  548.     if ( IconBase      )    CloseLibrary( IconBase );
  549.     if ( CxBase        )    CloseLibrary( CxBase );
  550.  
  551. #ifdef CS_DEBUG
  552.     if ( conwin        )    fclose(conwin);
  553. #endif
  554.  
  555.     exit( code );
  556. }
  557.  
  558.  
  559. /*=============================================================================
  560.  * Handle Commodity events...
  561.  *===========================================================================*/
  562.  
  563. BOOL HandleCXEvent( void )
  564. {
  565.     struct Message          *msg;
  566.     ULONG                    type, id;
  567.     UBYTE                    running = TRUE;
  568.  
  569.     /*
  570.      * A commodity message came through.
  571.      */
  572.       while ( msg = GetMsg( CSComPort )) {
  573.  
  574.           id      = CxMsgID(( CxMsg * )msg );
  575.           type    = CxMsgType(( CxMsg * )msg );
  576.           ReplyMsg( msg );
  577.  
  578.           switch ( type ) {
  579.  
  580.               case    CXM_IEVENT:
  581.                   switch ( id ) {
  582.  
  583.                       case    CX_SHOW:
  584.                           OpenTheWindow();
  585.                           break;
  586.  
  587.                       case    CX_SHUTUP:
  588.                           running = FALSE;
  589.                           break;
  590.                   }
  591.                   break;
  592.  
  593.               case    CXM_COMMAND:
  594.                   switch ( id )  {
  595.  
  596.                       case    CXCMD_KILL:
  597.                           running = FALSE;
  598.                           break;
  599.  
  600.                       case    CXCMD_DISABLE:
  601.                           CxOff( CSBroker );
  602.                           break;
  603.  
  604.                       case    CXCMD_ENABLE:
  605.                           CxOn( CSBroker );
  606.                           break;
  607.  
  608.                       case    CXCMD_UNIQUE:
  609.                       case    CXCMD_APPEAR:
  610.                           OpenTheWindow();
  611.                           break;
  612.  
  613.                       case    CXCMD_DISAPPEAR:
  614.                           CloseTheWindow();
  615.                           break;
  616.                   }
  617.                   break;
  618.           }
  619.       }
  620.  
  621.    return(running);
  622. }
  623.  
  624. /*=============================================================================
  625.  * Handle IDCMP events...
  626.  *===========================================================================*/
  627.  
  628. BOOL HandleIDCMPEvent( void )
  629. {
  630.     struct IntuiMessage     *imsg;
  631.     struct Gadget           *gad;
  632.     BOOL                     hideit;
  633.     ULONG                    class;
  634.     UWORD                    code;
  635.     UBYTE                    running = TRUE;
  636.  
  637.       /*
  638.        * A window message came through.
  639.        */
  640.         while ( CSIdPort && ( imsg = GT_GetIMsg( CSIdPort ))) {
  641.  
  642.             class   =   imsg->Class;
  643.             code    =   imsg->Code;
  644.             gad     =   ( struct Gadget * )imsg->IAddress;
  645.             GT_ReplyIMsg( imsg );
  646.  
  647.             switch ( class ) {
  648.  
  649.                 case    IDCMP_REFRESHWINDOW:
  650.                     GT_BeginRefresh( ColorSaverWnd );
  651.                     GT_EndRefresh( ColorSaverWnd, TRUE );
  652.                     break;
  653.  
  654.                 case    IDCMP_CLOSEWINDOW:
  655.                     hideit =Req("Hide|Quit",
  656.             "Which do you prefer ?");
  657.                     CloseTheWindow();
  658.                 if(!hideit)
  659.                    running = FALSE;
  660.                     break;
  661.  
  662.                 case    IDCMP_CHANGEWINDOW:
  663.                     ColorSaverLeft = ColorSaverWnd->LeftEdge;
  664.                     ColorSaverTop  = ColorSaverWnd->TopEdge;
  665.                     break;
  666.  
  667.                 case    IDCMP_GADGETUP:
  668.                 case    IDCMP_GADGETDOWN:
  669.                 case    IDCMP_MOUSEMOVE:
  670.                     HandleGadgetEvent(gad,code);
  671.                     break;
  672.  
  673.                 case IDCMP_VANILLAKEY:
  674.                     HandleVanillaKey(code);
  675.                     break;
  676.             }
  677.         }
  678.  
  679.    return(running);
  680. }
  681.  
  682. /*=============================================================================
  683.  * Handle gadget selections...
  684.  *===========================================================================*/
  685.  
  686. VOID HandleGadgetEvent( struct Gadget *gad, UWORD code )
  687. {
  688.  
  689. static BOOL copymode;
  690. static BOOL swapmode;
  691. static BOOL rangemode;
  692. static SHORT copycolor;
  693. static UBYTE swapred;
  694. static UBYTE swapgreen;
  695. static UBYTE swapblue;
  696.  
  697. if(gad->GadgetID != GD_PALETTE_GAD)
  698.   if(copymode || swapmode || rangemode)
  699.      {
  700.         copymode = swapmode = rangemode = FALSE;
  701.     SetOurPointer(MAIN_POINTER, FALSE);
  702.      }
  703.  
  704. switch (gad->GadgetID)
  705.     {
  706.       
  707.     case  GD_RED_GAD:
  708.     if(ColorMode == HSV_COLORMODE)
  709.           {
  710.        HueLevel = code; 
  711.          CalcRGB();
  712.           }
  713.       else
  714.        RedVal = code;
  715.  
  716.     SetRGB4(&Scr->ViewPort,CurrentColor,RedVal,GreenVal,BlueVal);
  717.         break;
  718.  
  719.     case  GD_GREEN_GAD:
  720.     if(ColorMode == HSV_COLORMODE)
  721.           {
  722.        SatLevel = code;
  723.          CalcRGB();
  724.           }
  725.     else
  726.        GreenVal=code;
  727.  
  728.     SetRGB4(&Scr->ViewPort,CurrentColor,RedVal,GreenVal,BlueVal);
  729.         break;
  730.  
  731.     case  GD_BLUE_GAD:
  732.     if(ColorMode == HSV_COLORMODE)
  733.           {
  734.        ValLevel=code;
  735.          CalcRGB();
  736.           }
  737.     else
  738.        BlueVal=code;
  739.  
  740.     SetRGB4(&Scr->ViewPort,CurrentColor,RedVal,GreenVal,BlueVal);
  741.         break;
  742.  
  743.     case  GD_PALETTE_GAD:
  744.     CurrentColor=(SHORT)code;
  745.         if(copymode)
  746.           {
  747.        GetColors(copycolor);
  748.        SetRGB4(&Scr->ViewPort,CurrentColor,RedVal,GreenVal,BlueVal);
  749.        }
  750.     else if(swapmode)
  751.           {
  752.        GetColors(CurrentColor);
  753.        swapred = RedVal;
  754.        swapgreen = GreenVal;
  755.        swapblue = BlueVal;
  756.        GetColors(copycolor);
  757.        SetRGB4(&Scr->ViewPort,CurrentColor,RedVal,GreenVal,BlueVal);
  758.        SetRGB4(&Scr->ViewPort,copycolor,swapred,swapgreen,swapblue);
  759.        }
  760.  
  761.     else if(rangemode)
  762.        ColorRange(copycolor,CurrentColor);
  763.  
  764.         if(copymode || swapmode || rangemode)
  765.        SetOurPointer(MAIN_POINTER, FALSE);
  766.  
  767.     SetProps(CurrentColor);
  768.         copymode = swapmode = rangemode = FALSE;
  769.         break;
  770.  
  771.     case  GD_COMP_GAD:
  772.     SetRGB4(&Scr->ViewPort,CurrentColor,(UBYTE)15-RedVal,
  773.           (UBYTE)15-GreenVal,(UBYTE)15-BlueVal);    
  774.     SetProps(CurrentColor);
  775.         break;
  776.  
  777.     case  GD_COPY_GAD:
  778.     copycolor = CurrentColor;
  779.         copymode = TRUE;
  780.     SetOurPointer(TO_POINTER, FALSE);
  781.         break;
  782.  
  783.     case  GD_SWAP_GAD:
  784.     copycolor = CurrentColor;
  785.         swapmode = TRUE;
  786.     SetOurPointer(TO_POINTER, FALSE);
  787.         break;
  788.  
  789.     case  GD_RANGE_GAD:
  790.     copycolor = CurrentColor;
  791.         rangemode = TRUE;
  792.     SetOurPointer(TO_POINTER, FALSE);
  793.         break;
  794.  
  795.     case  GD_SLEFT_GAD:
  796.     ShiftColorsLeft();
  797.     SetProps(CurrentColor);
  798.         break;
  799.  
  800.     case  GD_SRIGHT_GAD:
  801.     ShiftColorsRight();
  802.     SetProps(CurrentColor);
  803.         break;
  804.  
  805.     case  GD_RESET_GAD:
  806.     ResetPalette(RETRIEVE_IT);
  807.         break;
  808.  
  809.     case  GD_LOAD_GAD:
  810.     if(FileSelect(FILELOAD,LoadDir,LoadFile))
  811.        LoadColors(FileSpec, NumColors );
  812.     SetProps(CurrentColor);
  813.         break;
  814.  
  815.     case  GD_SAVE_GAD:
  816.     if(FileSelect(FILESAVE,LoadDir,LoadFile))
  817.        SaveColors(FileSpec, NumColors );
  818.         break;
  819.  
  820.     case  GD_OKAY_GAD:
  821.         CloseTheWindow();
  822.         break;
  823.  
  824.     case  GD_DO_GAD:
  825.         CopyMem((void *)Scr->ViewPort.ColorMap->ColorTable,(void *)ResetPal,64L);
  826.         break;
  827.  
  828.     case  GD_CANCEL_GAD:
  829.     ResetPalette(RETRIEVE_IT);
  830.         CloseTheWindow();
  831.         break;
  832.  
  833.     case  GD_SCAN_GAD:
  834.     if(FileSelect(FILESCAN,ScanDir,ScanFile))
  835.            FindTable(FileSpec, ResetPal, NumColors);
  836.         break;
  837.  
  838.     case  GD_CYCLE_GAD:
  839.         CycleSelect = code;
  840.         break;
  841.  
  842.     case  GD_WRITE_GAD:
  843.         CopyMem((void *)Scr->ViewPort.ColorMap->ColorTable,(void *)SavePal,64L);
  844.         Patch(ScanFileSpec, SavePal, NumColors);
  845.         break;
  846.  
  847.     case  GD_EXTRA_GAD:
  848.     About();
  849.         break;
  850.  
  851.     case GD_RGBHSV_GAD:
  852.     if (code == 0)
  853.       ColorMode = RGB_COLORMODE;
  854.         else
  855.       ColorMode = HSV_COLORMODE;
  856.  
  857.     SetColorMode(ColorMode);
  858.     SetProps(CurrentColor);
  859.         break;
  860.     
  861.     }
  862. }
  863.  
  864. /*=============================================================================
  865.  * Handle vanilla keys...
  866.  *===========================================================================*/
  867.  
  868. VOID HandleVanillaKey( UWORD code )
  869. {
  870.  
  871.   switch (code)
  872.     {
  873.     case 'U':
  874.     case 'u':
  875.     ResetPalette(RETRIEVE_IT);
  876.         break;
  877.  
  878.     case 'L':
  879.     case 'l':
  880.     if(FileSelect(FILELOAD,LoadDir,LoadFile))
  881.        LoadColors(FileSpec, NumColors );
  882.     SetProps(CurrentColor);
  883.         break;
  884.  
  885.     case 'S':
  886.     case 's':
  887.     if(FileSelect(FILESAVE,LoadDir,LoadFile))
  888.        SaveColors(FileSpec, NumColors );
  889.         break;
  890.  
  891.     case 'O':
  892.     case 'o':
  893.         CloseTheWindow();
  894.         break;
  895.  
  896.     case 'C':
  897.     case 'c':
  898.     ResetPalette(RETRIEVE_IT);
  899.         CloseTheWindow();
  900.         break;
  901.  
  902.     }
  903. }
  904.  
  905. /*=============================================================================
  906.  * A simple, programmable system requester...
  907.  *===========================================================================*/
  908.  
  909. long Req( UBYTE *gadgets, UBYTE *body, ... )
  910. {
  911.     static struct EasyStruct req = {
  912.         sizeof( struct EasyStruct ), NULL, NULL, NULL, NULL };
  913.     va_list                  args;
  914.     LONG                     rc;
  915.  
  916.     va_start( args, body );
  917.  
  918.     req.es_Title        = "ColorSaver Info";
  919.     req.es_TextFormat   = body;
  920.     req.es_GadgetFormat = gadgets;
  921.  
  922.     rc = EasyRequestArgs( ColorSaverWnd, &req, NULL, args );
  923.  
  924.     va_end( args );
  925.  
  926.     return( rc );
  927. }
  928.  
  929. /*=============================================================================
  930.  * Put up one of a variety of requesters and solicit a response.  Placed all
  931.  * requests in a separate routine so that ARexx reponses could be handled
  932.  * separately when the ColorSaver window was not open
  933.  *===========================================================================*/
  934.  
  935. int Notify( int message, ...)
  936. {
  937.   char *file;
  938.   ULONG offset;
  939.   int response;
  940.  
  941.   va_list args;
  942.  
  943.   va_start( args, message);
  944.  
  945.   if(!CSIsOpen) return(message);  /* If called from ARexx and window is hid */
  946.  
  947.   if(message == LOAD_MALLOC_FAIL) {
  948.      (void)Req("Uh Oh!","Can not allocate memory\nfor color palette!");
  949.      return(0);
  950.     }
  951.  
  952.   if(message == BUFFER_MALLOC_FAIL) {
  953.      (void)Req("Uh Oh!","Can not allocate memory\nfor input buffer!");
  954.      return(0);
  955.     }
  956.  
  957.   if(message == OFFSET_MALLOC_FAIL) {
  958.      (void)Req("Oh No!","Memory Allocation failure\nin routine AddOffSet()");
  959.      return(0);
  960.     }
  961.  
  962.   if (message == FILE_OPEN_FAIL) {
  963.      (void)Req("Oops!","Could not open file:\n->>> %s <<<-",
  964.            va_arg(args,char *));
  965.      return(0);
  966.     } 
  967.  
  968.   if (message == FILE_READ_IOERR) {
  969.      (void)Req("Oh No!","I/O error during read of:\n->>> %s <<<-",
  970.            va_arg(args, char *));
  971.      return(0);
  972.     } 
  973.  
  974.   if (message == FILE_WRITE_IOERR) {
  975.      (void)Req("Oh No!","I/O error during write of:\n->>> %s <<<-",
  976.            va_arg(args, char *));
  977.      return(0);
  978.     } 
  979.  
  980.   if (message == ABOUT_TO_WRITE) {
  981.  
  982. /* Can somebody tell me why the following doesn' work??? */
  983. /*
  984.     response=Req("Go Ahead|Cancel",
  985.     "About to write to file:\n->>> %s <<<-\nat offset: %ld",
  986.       va_arg(args,char *), va_arg(args, ULONG));*/
  987. /*
  988.  
  989. /* Instead, I have to use ...    */
  990.  
  991.      file = va_arg(args,char *);
  992.      offset = va_arg(args,ULONG);
  993.      response=Req("Go Ahead|Cancel",
  994.      "About to write to file:\n->>> %s <<<-\nat offset: %ld",
  995.       file, offset);
  996.  
  997.     return(response);
  998.     }
  999.  
  1000.   if (message == PALETTE_SIZE_MISMATCH) {
  1001.     response =Req("Load Anyway|Cancel","Number of BitPlanes\ndo not match!\n\n\
  1002.       Colors:\n\nScreen: %2ld  File: %2ld",va_arg(args,ULONG), va_arg(args,LONG)); 
  1003.     return(response);
  1004.     }
  1005.  
  1006.   if (message == NO_COLORTABLE_FOUND) {
  1007.     (void)Req("Oh Well!","Cannot find Color Table");
  1008.     return(0);
  1009.     }
  1010.  
  1011.   if (message == ONE_COLORTABLE_FOUND) {
  1012.     (void)Req("Yippie!","Found One Color Table match");
  1013.     return(0);
  1014.     }
  1015.  
  1016.   if (message == MULT_COLORTABLE_FOUND) {
  1017.     (void)Req("Hmm! (?)","Found %ld Color Table matches",
  1018.           va_arg(args,SHORT));
  1019.     return(0);
  1020.     }
  1021.  
  1022.   if (message == WRITE_SUCCESS) {
  1023.     (void)Req("I Hope it Works!","  >>>>> ALL DONE!! <<<<<  ");
  1024.     return(0);
  1025.     }
  1026.  
  1027.   va_end( args );
  1028.  
  1029. }
  1030.  
  1031.  
  1032. /*=============================================================================
  1033.  * Some program info
  1034.  *===========================================================================*/
  1035.  
  1036. void About( void )
  1037. {
  1038. (void)Req("I Promise!","     %s\n\n\
  1039.  >>>  This program is \"PostCardWare¹\"  <<<\n\n\
  1040. You may freely distribute this program in a \n\
  1041. non-commercial  manner  as long as original \n\
  1042. sources  and  documentation are included...\n\n\
  1043.    ( ¹And you send me a PostCard! ;)",CSTitle);
  1044.  
  1045. (void)Req("I'll Do It!","Send PostCards, Bug Reports,\n\
  1046. Comments and Suggestions to:\n\n\
  1047.        Dan Fish\n\
  1048.        815 E. Bethany #B135\n\
  1049.        Phoenix, Az.   85014\n\n\
  1050. Email: daf@daffy.amigalib.com");
  1051.  
  1052. }
  1053.